/*
 * This file is part of LexiToolsMobile
 *  
 * Author: Jerzy Wawro
 * ver. 1.00
 * Copyright: Tenar (http://www.tenar.pl)
 *
 * Mobile LexiTools is an open source project; you can redistribute it 
 * and/or modify it under the terms of the license as published -  GPL with 
 * the following modification:  fragments of the code may be not copyleft 
 * (hidden), to protect contents of the dicionaries.
 * In this case the author of non-public fragments of the code is obliged 
 * to make available functionally equivalent code for unprotected dictionaries.
 * 
 * Mobile LexiTools is distributed WITHOUT ANY WARRANTY.
 * See the license for more details.
 *  
 * You should have received a copy of the GNU General Public License
 * along with LexiToolsMobile (see: gpl.txt); if not - you can find it 
 * on web page http://www.fsf.org/, or write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package dict;

public class std_decoder {

    static int MAX_RES_SIZE =512;
    byte[] buffer;
    int ix;
    int cc;
    int lenb, x, xb;
    char[] result;
    int lenght;
	
    public std_decoder() {
        result= new char[MAX_RES_SIZE];
    }
            

   void set_cc(int x)
   {
      if (x>=buffer.length) {
           cc=0;
      }
      else {
        cc=buffer[x];
        if (cc<0) {
           cc=256+cc;
        }
      }
   }
   
   short ShiftLeft(short word) {
       int i;
       
       i=(int)word;
       if (lenb==0) {
           i=(i << 1) + 1;
           return (short) (i % 0x010000);
	}	
        else {
            lenb=lenb-1;
            xb = xb+1;
            if (xb>8) {
                xb=1;
                x = x+1;
                set_cc(ix+x);
            }
            if (cc>=128) {
                cc=(cc-128);
                cc=(cc<<1);
                i=(i << 1) + 1;
            }	
            else {
                cc=(cc<<1);
                i=(i << 1);
            }
           return (short) (i % 0x010000);
	}
    }
   
void add_res(char ch)
{
    if (lenght<MAX_RES_SIZE) {
        result[lenght]=ch;
        lenght=lenght+1;
    }
}

public void l1decode(byte[] pbuffer, int pix) {
    
    short pc;
    
    buffer = pbuffer;
    lenght=0;
    result[lenght]=0;
    ix=pix+1;
    if (pix>=buffer.length) return;
    
    set_cc(ix);
    lenb=8*buffer[pix];
    x=0; // indeks znaku 
    xb=0; // bit w znaku
    

    while (lenb>0) {
     pc=0;
     pc=ShiftLeft(pc);
     pc=ShiftLeft(pc);
     pc=ShiftLeft(pc);
     pc=ShiftLeft(pc);
     if (pc==0) {  add_res('a'); }
     else if (pc==1) { add_res(' '); }
     else if (pc==2) { add_res('o'); }
     else if (pc==3) { add_res('e'); }
     else if (pc==4) { add_res('i'); }
     else if (pc==5) { add_res('n'); }
     else if (pc==6) { add_res('z'); }
     else if (pc==7) { add_res('r'); }
     else { 
        pc=ShiftLeft(pc);
        if (pc==16) { add_res('w'); }
        else if (pc==17) { add_res('k'); }
        else if (pc==18) { add_res('s'); }
        else if (pc==19) { add_res('c'); }
        else if (pc==20) { add_res('y'); }
        else if (pc==21) { add_res('t'); }
        else if (pc==22) { add_res('p'); }
        else if (pc==23) { add_res('d'); }
        else if (pc==24) { add_res('u'); }
        else if (pc==25) { add_res('m'); }
        else if (pc==26) { add_res('l'); }
        else if (pc==27) { add_res('j'); }
        else {
         pc=ShiftLeft(pc);
         if (pc==56) { add_res('b'); }
         else if (pc==57) { add_res('g'); }
         else if (pc==58) { add_res('\u0142'); }
         else if (pc==59) { add_res('\u0107'); }
         else {
           pc=ShiftLeft(pc);
           if (pc==120) { add_res('('); }
           else if (pc==121) { add_res(')'); }
           else if (pc==122) { add_res('\u0119'); }
           else if (pc==123) { add_res('h'); }
           else {
             pc=ShiftLeft(pc);
             if (pc==248) { add_res('\u015B'); }
             else if (pc==249) { add_res('\u00F3'); }
             else if (pc==250) { add_res('\u017C'); }
             else if (pc==251) { add_res('\u0105'); }
             else {
               pc=ShiftLeft(pc);
               if (pc==504) { add_res('f'); }
               else if (pc==505) { add_res('.'); }
               else if (pc==506) { add_res('\u0144'); }
               else if (pc==507) { add_res('['); }
               else {
                 pc=ShiftLeft(pc);
                 pc=ShiftLeft(pc);
                 if (pc==2032) {
                     add_res(']'); }
                 else if (pc==2033) { add_res('S'); }
                 else if (pc==2034) { add_res('U'); }
                 else if (pc==2035) { add_res('\u017A'); }
                 else if (pc==2036) { add_res('?'); }
                 else if (pc==2037) { add_res('P'); }
                 else if (pc==2038) { add_res('C'); }
                 else if (pc==2039) { add_res(','); }
                 else {
                   pc=ShiftLeft(pc);
                   pc=ShiftLeft(pc);
                   if (pc==8160) {
                       add_res('!'); }
                   else if (pc==8161) { add_res('I'); }
                   else if (pc==8162) { add_res('M'); }
                   else if (pc==8163) { add_res('A'); }
                   else if (pc==8164) { add_res('W'); }
                   else if (pc==8165) { add_res('B'); }
                   else if (pc==8166) { add_res('-'); }
                   else if (pc==8167) { add_res('T'); }
                   else if (pc==8168) { add_res('D'); }
                   else if (pc==8169) { add_res('E'); }
                   else if (pc==8170) { add_res('G'); }
                   else if (pc==8171) { add_res('R'); }
                   else if (pc==8172) { add_res('O'); }
                   else if (pc==8173) { add_res('N'); }
                   else if (pc==8174) { add_res('K'); }
                   else if (pc==8175) { add_res('V'); }
                   else if (pc==8176) { add_res('Z'); }
                   else if (pc==8177) { add_res('"'); }
                   else if (pc==8178) { add_res('J'); }
                   else if (pc==8179) { add_res('1'); }
                   else if (pc==8180) { add_res('L'); }
                   else if (pc==8181) { add_res('0'); }
                   else if (pc==8182) { add_res('F'); }
                   else if (pc==8183) { add_res('H'); }
                   else {
                     pc=ShiftLeft(pc);
                     pc=ShiftLeft(pc);
                     pc=ShiftLeft(pc);
                     if (pc==65472) { add_res('\u015A'); }
                     else if (pc==65473) { add_res('2'); }
                     else if (pc==65474) { add_res('v'); }
                     else if (pc==65475) { add_res('/'); }
                     else if (pc==65476) { add_res('3'); }
                     else if (pc==65477) { add_res('4'); }
                     else if (pc==65478) { add_res('5'); }
                     else if (pc==65479) { add_res('x'); }
                     else if (pc==65480) { add_res('6'); }
                     else if (pc==65481) { add_res('X'); }
                     else if (pc==65482) { add_res('8'); }
                     else if (pc==65483) { add_res(';'); }
                     else if (pc==65484) { add_res('+'); }
                     else if (pc==65485) { add_res('{'); }
                     else if (pc==65486) { add_res('='); }
                     else if (pc==65487) { add_res('}'); }
                     else if (pc==65488) { add_res('9'); }
                     else if (pc==65489) { add_res('q'); }
                     else if (pc==65490) { add_res('\''); }
                     else if (pc==65491) { add_res('7'); }
                     else if (pc==65492) { add_res(':'); }
                     else if (pc==65493) { add_res('Y'); }
                     else if (pc==65494) { add_res('Q'); }
                     else if (pc==65495) { add_res('?'); }
                     else if (pc==65496) { add_res('\u0141'); }
                     else if (pc==65497) { add_res('$'); }
                     else if (pc==65498) { add_res('%'); }
                     else if (pc==65499) { add_res('\u017B'); }
                     else if (pc==65500) { add_res('é'); } // �é
                     else if (pc==65501) { add_res('#'); }
                     else if (pc==65502) { add_res('&'); }
                     else if (pc==65503) { add_res('@'); }
                     else if (pc==65504) { add_res('\\'); }
                     else if (pc==65505) { add_res('\u0179'); }

                   }
                 }
               }
             }
           }
         }
        }
     }
 }
 result[lenght]=0;
}					   



public void l2decode(byte[] pbuffer, int pix) {
   
    short pc;
    
    buffer = pbuffer;
    ix=pix+1;
    lenght=0;
    result[lenght]=0;
    ix=pix+1;
    if (pix>=buffer.length) return;
    set_cc(ix);
    lenb=8*buffer[pix];
    x=0; // indeks znaku 
    xb=0; // bit w znaku
    
    lenght=0;

    while (lenb>0) {
     pc=0;
     pc=ShiftLeft(pc);
     pc=ShiftLeft(pc);
     pc=ShiftLeft(pc);
     pc=ShiftLeft(pc);
     if (pc==0)  { add_res('e'); }
     else if (pc==1) { add_res(' '); }
     else if (pc==2) { add_res('a'); }
     else if (pc==3) { add_res('t'); }
     else if (pc==4) { add_res('o'); }
     else if (pc==5) { add_res('i'); }
     else if (pc==6) { add_res('r'); }
     else if (pc==7) { add_res('n'); }
     else if (pc==8) { add_res('s'); }
     else if (pc==9) { add_res('l'); }
     else if (pc==10) { add_res('c'); }
     else if (pc==11) { add_res('d'); }
     else {
       pc=ShiftLeft(pc);
       if (pc==24) { add_res('h'); }
       else if (pc==25) { add_res('u'); }
       else if (pc==26) { add_res('p'); }
       else if (pc==27) { add_res('m'); }
       else { 
         pc=ShiftLeft(pc);
         if (pc==56) { add_res('g'); }
         else if (pc==57) { add_res('f'); }
         else if (pc==58) { add_res('b'); }
         else if (pc==59) { add_res('y'); }
         else { 
           pc=ShiftLeft(pc);
           if (pc==120) { add_res('?'); }
           else if (pc==121) { add_res('w'); }
           else if (pc==122) { add_res('k'); }
           else if (pc==123) { add_res('v'); }
           else {
             pc=ShiftLeft(pc);
             if (pc==248) { add_res('*'); }
             else if (pc==249) { add_res('-'); }
             else if (pc==250) { add_res('.'); }
             else if (pc==251) { add_res('x'); }
             else {
               pc=ShiftLeft(pc);
               pc=ShiftLeft(pc);
               if (pc==1008) { add_res('\''); }
               else if (pc==1009) { add_res('I'); }
               else if (pc==1010) { add_res('j'); }
               else if (pc==1011) { add_res('q'); }
               else if (pc==1012) { add_res('z'); }
               else if (pc==1013) { add_res('C'); }
               else if (pc==1014) { add_res('S'); }
               else if (pc==1015) { add_res('('); }
               else { 
                 pc=ShiftLeft(pc);
                 if (pc==2032) { add_res(')'); }
                 else if (pc==2033) { add_res('P'); }
                 else if (pc==2034) { add_res('T'); }
                 else if (pc==2035) { add_res('W'); }
                 else if (pc==2036) { add_res('A'); }
                 else if (pc==2037) { add_res('D'); }
                 else if (pc==2038) { add_res('M'); }
                 else if (pc==2039) { add_res('E'); }
                 else {
                   pc=ShiftLeft(pc);
                   if (pc==4080) { add_res('H'); }
                   else if (pc==4081) { add_res('#'); }
                   else if (pc==4082) { add_res('!'); }
                   else if (pc==4083) { add_res('V'); }
                   else if (pc==4084) { add_res('G'); }
                   else if (pc==4085) { add_res('B'); }
                   else if (pc==4086) { add_res('R'); }
                   else if (pc==4087) { add_res('N'); }
                   else { 
                     pc=ShiftLeft(pc);
                     if (pc==8176) { add_res('F'); }
                     else if (pc==8177) { add_res('L'); }
                     else if (pc==8178) { add_res('O'); }
                     else if (pc==8179) { add_res(','); }
                     else if (pc==8180) { add_res('U'); }
                     else if (pc==8181) { add_res('0'); }
                     else if (pc==8182) { add_res('/'); }
                     else if (pc==8183) { add_res('Y'); }
                     else { 
                       pc=ShiftLeft(pc);
                       if (pc==16368) { add_res('1'); }
                       else if (pc==16369) { add_res('K'); }
                       else if (pc==16370) { add_res('J'); }
                       else if (pc==16371) { add_res('X'); }
                       else if (pc==16372) { add_res('2'); }
                       else if (pc==16373) { add_res('4'); }
                       else if (pc==16374) { add_res('3'); }
                       else if (pc==16375) { add_res('?'); }
                       else if (pc==16376) { add_res('&'); }
                       else if (pc==16377) { add_res('5'); }
                       else if (pc==16378) { add_res('6'); }
                       else if (pc==16379) { add_res('?'); }
                       else if (pc==16380) { add_res('Q'); }
                       else if (pc==16381) { add_res('"'); }
                  }
                 }
               }
             }
           }
         }
       }
     }
   }
 }
 result[lenght]=0;
}					   

}
